home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1985-08-27 | 11.0 KB | 363 lines |
- 10 ' ADVENTURE SYSTEM DATABASE COMPILER 2.1
- 15 '
- 20 ' last revision 3/1/83 by JRC
- 25 '
- 30 ' This version (2.1) is not completely compatible with version 2.0; verbs
- 35 ' must have a number after them. Modify previous source files by putting
- 37 ' a ,0 after the verb. For other limitations, see the .DOC file.
- 40 '
- 50 ' Peter F. Levy Jim R. Cummins
- 60 ' 4209 Longmeadow Way 5 Jacob St.
- 70 ' Fort Worth, TX 76133 Ballston Lake, NY 12019
- 80 ' (817) 292-8731 CompuServe [72155,1174]
- 90 ' WARNING FROM MIKE......THIS PROGRAM SEEMS TO BE FAIRLY BUGGY
- 100 KEY OFF:DEFINT A-Z:FALSE=0:TRUE=NOT FALSE
- 109 ' Next line determines the type of monitor - works with PC/DOS 1.10
- 110 DEF SEG=0:WTH=PEEK(&H410) AND &H30:DEF SEG
- 120 IF WTH=&H30 THEN WTH=80:CGCARD=FALSE ELSE CGCARD=TRUE:IF WTH=&H20 THEN WTH=80 ELSE WTH=40
- 129 ' Modify the next line to set your own color scheme
- 130 SCREEN 0,1:FGD=6:BGD=1:BRD=1:COLOR FGD,BGD,BRD:WIDTH WTH:CLS
- 140 PRINT "ADVENTURE SYSTEM DATABASE COMPILER 2.1":PRINT
- 150 PRINT "Written by Peter F. Levy":PRINT TAB(12)"4209 Longmeadow Way"
- 160 PRINT TAB(12)"Fort Worth, TX 76133":PRINT TAB(12)"(817) 292-8731"
- 170 PRINT:PRINT"Modified and Adapted for the":PRINT"<<<IBM Personal Computer>>> by"
- 180 PRINT TAB(12)"Jim R. Cummins":PRINT TAB(12)"5 Jacob St."
- 190 PRINT TAB(12)"Ballston Lake, NY 12019"
- 200 PRINT TAB(12)"CompuServe [72155,1174]":PRINT
- 210 ON ERROR GOTO 20060
- 220 INPUT;"Database name? ";F$:IF F$="" THEN 220
- 230 PRINT" on which drive? (A-D) ";:CD1$=INPUT$(1):PRINT CD1$
- 240 IF INSTR("AaBbCcDd",CD1$) THEN CD1$=CD1$+":" ELSE CD1$=""
- 250 PRINT"Compilation drive? (A-D) ";:CD$=INPUT$(1):PRINT CD$
- 260 IF INSTR("AaBbCcDd",CD$) THEN CD$=CD$+":" ELSE CD$=""
- 270 PRINT "Hard copy of compilation messages? (Y/N) ";:HC$=INPUT$(1)
- 280 PRINT HC$:IF INSTR("Yy",HC$) THEN PRT=TRUE ELSE PRT=FALSE
- 300 DIM VS$(8),NS$(8),TS$(2)
- 310 FOR I=1 TO 8
- 320 VS$(I)=STRING$(255,32)
- 330 NS$(I)=VS$(I)
- 340 NEXT I
- 350 NL$=STRING$(255,0):VL$=NL$
- 360 TS$(1)=STRING$(255,32)
- 365 TS$(2)=TS$(1)
- 370 TN$=STRING$(100,0)
- 380 DEF FNEW$(X)="*** ERROR"+STR$(X)+" -- "
- 390 RESTORE ' Get Tokens
- 400 FOR K=1 TO 100
- 410 READ TK$:IF TK$="*END" THEN K=100:GOTO 460
- 420 I=1-(K>50)
- 430 J=5*(K-50*(I-1))-2
- 440 MID$(TS$(I),J,4)=TK$
- 450 MID$(TN$,K,1)=CHR$(K)
- 460 NEXT K
- 470 PRINT
- 480 PRINT "Setting up files"
- 490 OPEN "I",1,CD1$+F$+".ADV"
- 510 OPEN "O",2,CD$+F$+".DAT"
- 520 OPEN "R",3,CD$+F$+".REF",32
- 530 FIELD#3,32 AS AO$
- 540 REC.LOC=2 ' Save space for disassemble info.
- 550 VERSION$="IBMPC Ver 2.1(c)1983 JR Cummins"
- 560 ON ERROR GOTO 20000
- 1000 '
- 1010 ' COMPILE STARTUP TEXT
- 1020 ' --------------------
- 1030 PRINT "Compiling startup header"
- 1040 IF PRT THEN LPRINT "Compiling startup header"
- 1050 GOSUB 13000
- 1060 IF AS$="" THEN PRINT#2,CHR$(255):GOTO 2000
- 1090 PRINT#2,AS$;
- 1100 GOTO 1050
- 2000 '
- 2010 ' COMPILE VERB LIST
- 2020 ' -----------------
- 2030 PRINT "Compiling verb table"
- 2040 IF PRT THEN LPRINT "Compiling verb table"
- 2050 FOR K=1 TO 199
- 2060 INPUT #1,A$
- 2070 IF A$="" THEN 2200
- 2080 INPUT #1,AL
- 2090 MID$(VL$,K,1)=CHR$(AL+32)
- 2100 I=1+FIX((K-1)/25)
- 2110 J=10*(K-25*(I-1))-8
- 2120 MID$(VS$(I),J,9)=A$
- 2130 NEXT K:ER=ER+1:PRINT FNEW$(ER);"Too many verbs"
- 2140 IF PRT THEN LPRINT FNEW$(ER);"Too many verbs"
- 2150 INPUT #1,V$:IF V$="" THEN 2200 ELSE INPUT #1,AL:GOTO 2150
- 2200 FOR I=1 TO 8:PRINT#2,VS$(I);:NEXT:PRINT#2,VL$;
- 2300 NVERBS=K:PRINT NVERBS-1;" verbs compiled."
- 2310 IF PRT THEN LPRINT NVERBS-1;" verbs compiled."
- 3000 '
- 3010 ' COMPILE NOUN LIST AND LINKS
- 3020 ' ---------------------------
- 3030 PRINT "Compiling noun and link table"
- 3040 IF PRT THEN LPRINT "Compiling noun and link table"
- 3050 FOR K=1 TO 199
- 3060 INPUT #1,N$
- 3070 IF N$="" THEN 3200
- 3080 INPUT #1,AL
- 3090 MID$(NL$,K,1)=CHR$(AL+32)
- 3100 I=1+FIX((K-1)/25)
- 3110 J=10*(K-(25*(I-1)))-8
- 3120 MID$(NS$(I),J,9)=N$
- 3130 NEXT K:ER=ER+1:PRINT FNEW$(ER);"Too many nouns"
- 3140 IF PRT THEN LPRINT FNEW$(ER);"Too many nouns"
- 3150 INPUT #1,N$:IF N$="" THEN 3200 ELSE INPUT #1,AL:GOTO 3150
- 3200 FOR I=1 TO 8:PRINT#2,NS$(I);:NEXT:PRINT#2,NL$;
- 3300 NNOUNS=K:PRINT NNOUNS-1;" nouns compiled."
- 3310 IF PRT THEN LPRINT NNOUNS-1;" nouns compiled."
- 3400 DIM NDX(NVERBS*NNOUNS+768)
- 4000 '
- 4010 ' COMPILE OBJECT TABLE
- 4020 ' --------------------
- 4030 PRINT "Compiling object table"
- 4040 IF PRT THEN LPRINT "Compiling object table"
- 4045 OS$=SPACE$(32)
- 4050 FOR K=1 TO 255
- 4060 INPUT #1,Z
- 4070 IF Z=0 THEN 4300 ELSE IF Z=K THEN 4100
- 4080 ER=ER+1:PRINT FNEW$(ER);"Object number";Z;"sequence mismatch"
- 4090 IF PRT THEN LPRINT FNEW$(ER);"Object number";Z;"sequence mismatch"
- 4100 INPUT #1,OB$:INPUT #1,SR,WT,VA
- 4110 LSET OS$=STRING$(2,SR)+CHR$(WT)+CHR$(VA)+STRING$(2,0)+OB$
- 4120 PRINT #2,OS$;
- 4130 GOSUB 13000
- 4160 X=NDX(Z):IF X=0 THEN 4190
- 4170 ER=ER+1:PRINT FNEW$(ER);"Duplicate object number";Z
- 4180 IF PRT THEN LPRINT FNEW$(ER);"Duplicate object number";Z
- 4190 X=REC.LOC+1:NDX(Z)=X
- 4200 GOSUB 12000
- 4210 X=REC.LOC:NDX(Z)=NDX(Z)*8+X-NDX(Z)
- 4220 NEXT K:ER=ER+1:PRINT FNEW$(ER);"Too many objects"
- 4230 IF PRT THEN LPRINT FNEW$(ER);"Too many objects"
- 4240 INPUT #1,Z:IF Z<>0 THEN LINE INPUT OB$:GOTO 4240
- 4300 PRINT #2,STRING$(32,255);
- 4310 NOBJ=K:PRINT NOBJ-1;" objects compiled."
- 4320 IF PRT THEN LPRINT NOBJ-1;" objects compiled."
- 5000 '
- 5010 ' COMPILE ROOM TABLE
- 5020 ' ------------------
- 5030 PRINT "Compiling room and link table"
- 5040 IF PRT THEN LPRINT "Compiling room and link table"
- 5045 RS$=SPACE$(32)
- 5050 INPUT #1,SR
- 5060 PRINT #2,CHR$(SR);
- 5070 FOR K=1 TO 254
- 5080 INPUT #1,RN:Z=RN+256
- 5090 IF RN=0 THEN 5300 ELSE IF RN=K THEN 5120
- 5100 ER=ER+1:PRINT FNEW$(ER);"Room number";RN;"sequence mismatch"
- 5110 IF PRT THEN LPRINT FNEW$(ER);"Room number";RN;"sequence mismatch"
- 5120 INPUT #1,RM$:INPUT #1,N,S,E,W,U,D
- 5130 LSET RS$=CHR$(N)+CHR$(S)+CHR$(E)+CHR$(W)+CHR$(U)+CHR$(D)+RM$
- 5140 PRINT #2,RS$;
- 5150 GOSUB 13000
- 5180 X=NDX(Z):IF X=0 THEN 5210
- 5190 ER=ER+1:PRINT FNEW$(ER);"Duplicate room number";RN
- 5200 IF PRT THEN LPRINT FNEW$(ER);"Duplicate room number";RN
- 5210 X=REC.LOC+1:NDX(Z)=X
- 5220 GOSUB 12000
- 5230 X=REC.LOC:NDX(Z)=NDX(Z)*8+X-NDX(Z)
- 5240 NEXT K:ER=ER+1:PRINT FNEW$(ER);"Too many rooms"
- 5250 IF PRT THEN LPRINT FNEW$(ER);"Too many rooms"
- 5260 INPUT #1,RN:IF RN<>0 THEN LINE INPUT RM$:GOTO 5260
- 5300 PRINT #2,STRING$(32,255);
- 5310 NROOM=K:PRINT NROOM-1;" rooms compiled."
- 5320 IF PRT THEN LPRINT NROOM-1;" rooms compiled."
- 6000 '
- 6010 ' COMPILE MESSAGE TABLE
- 6020 ' ---------------------
- 6030 PRINT "Compiling message table"
- 6040 IF PRT THEN LPRINT "Compiling message table"
- 6050 FOR K=1 TO 255
- 6060 INPUT #1,MN:Z=K+512
- 6070 IF MN=0 THEN 6500 ELSE IF MN=K THEN 6100
- 6080 ER=ER+1:PRINT FNEW$(ER);"Message number";MN;"sequence mismatch"
- 6090 IF PRT THEN LPRINT FNEW$(ER);"Message number";MN;"sequence mismatch"
- 6100 GOSUB 13000
- 6130 X=NDX(Z):IF X=0 THEN 6160
- 6140 ER=ER+1:PRINT FNEW$(ER);"Duplicate message number";MN
- 6150 IF PRT THEN LPRINT FNEW$(ER);"Duplicate message number";MN
- 6160 X=REC.LOC+1:NDX(Z)=X
- 6170 GOSUB 12000
- 6180 X=REC.LOC:NDX(Z)=NDX(Z)*8+X-NDX(Z)
- 6190 NEXT K:ER=ER+1:PRINT FNEW$(ER);"Too many messages"
- 6200 IF PRT THEN LPRINT FNEW$(ER);"Too many messages"
- 6500 NMESG=K:PRINT NMESG-1;" messages compiled."
- 6510 IF PRT THEN LPRINT NMESG-1;" messages compiled."
- 7000 '
- 7010 ' COMPILE IMPLICIT(OR AUTO) ACTIONS
- 7020 ' ---------------------------------
- 7030 K=0:PRINT "Compiling implicit action table"
- 7040 IF PRT THEN LPRINT "Compiling implicit action table"
- 7050 LINE INPUT #1,AC$
- 7060 IF AC$="" THEN 7400
- 7070 AS$="":K=K+1:GOSUB 11070
- 7080 A$=RIGHT$(AC$,2)
- 7090 IF A$<>" ." AND A$<>" ," THEN GOSUB 21000
- 7100 GOSUB 11000
- 7110 IF T$="." THEN 7200
- 7120 IF T$="," THEN 7220
- 7130 GOSUB 10000
- 7140 GOTO 7100
- 7200 PRINT #2,AS$+CHR$(0);
- 7210 GOTO 7050
- 7220 LINE INPUT #1,AC$
- 7230 A$=RIGHT$(AC$,2)
- 7240 IF A$<>" ." AND A$<>" ," THEN GOSUB 21000
- 7250 GOSUB 11070
- 7260 GOTO 7100
- 7400 PRINT #2,CHR$(255);
- 7410 NAUTO=K+1:PRINT K;" implicit actions compiled."
- 7420 IF PRT THEN LPRINT K;" implicit actions compiled."
- 8000 '
- 8010 ' LOAD & COMPILE EXPLICIT ACTION TABLE
- 8020 ' ------------------------------------
- 8030 K=0:PRINT "Compiling explicit action table"
- 8035 IF PRT THEN LPRINT "Compiling explicit action table"
- 8040 LINE INPUT #1,AC$
- 8050 IF AC$="" THEN 8800
- 8060 AS$="":K=K+1:GOSUB 11070
- 8070 ' EXTRACT VERB & NOUN, TRUNCATE AC$
- 8080 GOSUB 11000:V$=MID$(T$,1,9)
- 8090 GOSUB 11000:N$=MID$(T$,1,9)
- 8100 A$=RIGHT$(AC$,2)
- 8110 IF A$<>" ." AND A$<>" ," THEN GOSUB 21000:PRINT TAB(15);V$;" ";N$
- 8120 ' GET VERB NUMBER
- 8130 V=0:I=1
- 8140 J=INSTR(VS$(I)," "+V$+" ")
- 8150 IF J=0 AND I<8 THEN I=I+1: GOTO 8140
- 8160 IF J>0 AND I<9 THEN V=1+FIX(J/10)+25*(I-1)
- 8170 IF V>0 THEN 8200
- 8180 ER=ER+1:PRINT FNEW$(ER);"Bad verb -- ";V$
- 8190 IF PRT THEN LPRINT FNEW$(ER);"Bad verb -- ";V$
- 8200 ' Get NOUN number
- 8210 N=0:I=1
- 8220 J=INSTR(NS$(I)," "+N$+" ")
- 8230 IF J=0 AND I<8 THEN I=I+1: GOTO 8220
- 8240 IF J>0 AND I<9 THEN N=1+FIX(J/10)+25*(I-1)
- 8250 IF N>0 OR N$="ANY" THEN 8300
- 8260 ER=ER+1:PRINT FNEW$(ER);"Bad noun -- ";N$
- 8270 IF PRT THEN LPRINT FNEW$(ER);"Bad noun -- ";N$
- 8300 ' Calculate and place INDEX byte pair
- 8310 Y=NNOUNS*V+N:IF Y>0 THEN IF Y>YMAX THEN YMAX=Y:GOTO 8400 ELSE 8400
- 8320 ER=ER+1:PRINT FNEW$(ER);"Zero action index code ";V$;" ";N$: GOTO 8040
- 8330 IF PRT THEN LPRINT FNEW$(ER);"Zero action index code ";V$;" ";N$:GOTO 8040
- 8400 Z=Y+768:X=NDX(Z):IF X=0 THEN 8430
- 8410 ER=ER+1:PRINT FNEW$(ER);"Duplicate action entry -- ";V$;" ";N$
- 8420 IF PRT THEN LPRINT FNEW$(ER);"Duplicate action entry -- ";V$;" ";N$
- 8430 X=REC.LOC+1:NDX(Z)=X
- 8440 GOSUB 11000
- 8450 IF T$="." THEN 8500
- 8460 IF T$="," THEN 8600
- 8470 GOSUB 10000
- 8480 GOTO 8440
- 8500 AS$=AS$+CHR$(0)
- 8510 GOSUB 12000
- 8520 X=REC.LOC:NDX(Z)=NDX(Z)*8+X-NDX(Z)
- 8530 GOTO 8040
- 8600 LINE INPUT #1,AC$
- 8610 A$=RIGHT$(AC$,2)
- 8620 IF A$<>" ." AND A$<>" ," THEN GOSUB 21000
- 8630 GOSUB 11070
- 8640 GOTO 8440
- 8800 NACTS=K+1:PRINT K;" explicit actions compiled."
- 8810 IF PRT THEN LPRINT K;" explicit actions compiled."
- 9000 '
- 9010 ' END COMPILATION
- 9020 ' ---------------
- 9030 ' Write INDEX file to disk
- 9040 FOR I=1 TO NOBJ:PRINT#2,STR$(NDX(I));:NEXT
- 9050 FOR I=1 TO NROOM:PRINT#2,STR$(NDX(I+256));:NEXT
- 9060 FOR I=1 TO NMESG:PRINT#2,STR$(NDX(I+512));:NEXT
- 9070 FOR I=1 TO YMAX:PRINT#2,STR$(NDX(I+768));:NEXT
- 9080 LSET AO$=VERSION$
- 9100 AS$=CHR$(NVERBS)+CHR$(NNOUNS)+CHR$(NOBJ)+CHR$(NROOM)+CHR$(NMESG)+CHR$(NAUTO)
- 9110 AS$=AS$+CHR$(FIX(NACTS/256))+CHR$(NACTS MOD 256)+CHR$(FIX(YMAX/256))+CHR$(YMAX MOD 256)
- 9120 LSET AO$=AS$
- 9130 PUT#3,2
- 9140 CLOSE
- 9150 PRINT "Compilation complete: ";ER;"error(s)."
- 9160 IF PRT THEN LPRINT "Compilation complete: ";ER;"error(s)."
- 9170 ON ERROR GOTO 0
- 9180 END
- 10000 '
- 10010 ' COMPILE DATA GROUP OR TOKEN
- 10020 ' ---------------------------
- 10030 V=VAL(T$)
- 10040 IF V=0 AND T$<>"0" THEN 10100
- 10050 ' DATA: Copy to file & loop
- 10060 IF V<0 THEN V=ABS(V)+128
- 10070 AS$=AS$+CHR$(V)
- 10080 RETURN
- 10100 ' TOKEN: Convert to number code & Compile on disk
- 10110 S=0:IF T$="" THEN 10250
- 10120 IF ASC(T$)=45 THEN S=1:T$=MID$(T$,2,4)
- 10130 T1=INSTR(TS$(1),T$)
- 10140 IF T1=0 THEN T1=250+INSTR(TS$(2),T$)
- 10150 IF T1<>0 AND T1<>250 THEN 10180
- 10160 ER=ER+1:PRINT FNEW$(ER);"Bad token -- ";T$
- 10170 IF PRT THEN LPRINT FNEW$(ER);"Bad token -- ";T$
- 10180 T2=(T1-1)/5+1
- 10190 IF T2=0 THEN T3=0: GOTO 10220
- 10200 T3=ASC(MID$(TN$,T2,1))
- 10210 T3=T3+128*S
- 10220 AS$=AS$+CHR$(T3)
- 10230 RETURN
- 10250 ER=ER+1:PRINT FNEW$(ER);"Null token"
- 10260 IF PRT THEN LPRINT FNEW$(ER);"Null token"
- 10270 RETURN
- 11000 '
- 11010 ' EXTRACT A TOKEN FROM STRING AC$ & TRUNCATE AC$
- 11020 ' ----------------------------------------------
- 11030 A=INSTR(AC$," ")
- 11040 IF A=0 THEN T$=AC$:AC$="":RETURN
- 11050 T$=LEFT$(AC$,A-1)
- 11060 AC$=RIGHT$(AC$,LEN(AC$)-A)
- 11070 IF ASC(AC$)=32 THEN AC$=RIGHT$(AC$,LEN(AC$)-1): GOTO 11070
- 11080 RETURN
- 12000 '
- 12010 ' PUT RECORDS IN RANDOM FILE
- 12020 ' --------------------------
- 12030 LSET AO$=AS$
- 12040 REC.LOC=REC.LOC+1
- 12050 PUT #3,REC.LOC
- 12060 IF LEN(AS$)>32 THEN AS$=RIGHT$(AS$,LEN(AS$)-32):GOTO 12030
- 12070 RETURN
- 13000 '
- 13010 ' READ TEXT DESCRIPTIONS AND REPLACE "/" WITH <LF>
- 13020 ' ------------------------------------------------
- 13030 LINE INPUT #1,AS$
- 13040 I=INSTR(AS$,"/")
- 13050 IF I THEN MID$(AS$,I,1)=CHR$(10):GOTO 13040
- 13060 RETURN
- 20000 '
- 20010 ' ERROR TRAP
- 20020 ' ----------
- 20030 IF ERR=27 THEN PRT=FALSE:PRINT"Printer Out of Paper.":RESUME NEXT
- 20040 IF ERR=62 THEN PRINT"End of Source File.":RESUME 9000
- 20050 IF ERR=61 OR ERR=67 THEN PRINT"Disk Full. Change Disk and Recompile.":ON ERROR GOTO 0
- 20060 IF ERR=53 THEN PRINT"File Not Found.":PRINT"Insert proper disk and press any key to continue.":AS$=INPUT$(1):RESUME
- 20070 IF ERR=70 OR ERR=71 THEN PRINT"Disk write protected or not ready.":PRINT"Press any key when ready.":AS$=INPUT$(1):RESUME
- 20200 PRINT"Unrecoverable Error"
- 20210 ON ERROR GOTO 0
- 21000 ER=ER+1:PRINT FNEW$(ER);"Bad action terminator <"A$">"
- 21010 PRINT TAB(15),"Action item is terminated."
- 21020 AC$=AC$+" ."
- 21030 IF NOT PRT THEN RETURN
- 21040 LPRINT FNEW$(ER);"Bad action terminator <"A$">"
- 21050 LPRINT TAB(15),"Action item is terminated."
- 21060 RETURN
- 30000 '
- 30010 ' TOKEN TABLE
- 30020 ' -----------
- 30030 DATA HASX,NCRX,AVLX,XINY,NSRX,NR0X,XW/Y
- 30040 DATA HASL,NCRL,AVLL,LINY,NSRL,NR0L,LW/X
- 30050 DATA RAND,CEQN,CGEN,CEQC,CGEC,XSET,INRX,LIGH,LDGT,OBJ=
- 30060 DATA X2RY,X2OY,X2CR,X2SR,X2R0,X<>Y
- 30070 DATA L2RY,L2OY,L2CR,L2SR,L2R0,L<>X
- 30080 DATA DROP,P2RX,P2OX,SCO+,HEAL,CTX+,CTX=,SETX,CLRX,MSGX
- 30090 DATA ENDG,LMP1,LMP0,DIAG,WAIT,ECHO,RPTV,RPTN,RPTO,ELSE
- 30100 DATA SAVE,LOAD
- 30110 DATA *END
- 50000 ' LAST LINE
-